package com.azt.utils;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
public class PasswordUtil {

	/** 
	 * 生成盐值
	 * @author  张栋
	 */
	public static String getRandomSalt(int digit){
		return RandomStringUtils.randomAlphanumeric(digit);
	}
	/** 
	 * 
	 * 
	 * 混淆加密后的密码（暂不适合安装通平台）
	 * salt为空不混淆
	 * @author  张栋
	 */
	public static String encodePassword(String rawPass, String salt) {
		String saltedPass = mergePasswordAndSalt(rawPass, salt, false);
		return DigestUtils.md5Hex(saltedPass);
	}
	
	/**
	 * 
	 * @Description 验证密码是否正确
	 * @param password 用户输入的密码
	 * @param salt 盐值
	 * @param encryptionPassword 加密后的密码
	 * @return
	 */
	public static boolean checkPassword(String password , String salt , String encryptionPassword){
		if(StringUtils.isBlank(password)) return false;
		return encodePasswordForAZT(password, salt).equals(encryptionPassword);
	}
	
	
	/**
	 * 
	 * 加密使用这个方法 谢谢
	 * 
	 * @Description 新版使用的密码加密方法
	 * @param rawPass 用户输入密码
	 * @param salt 随机生成的盐值
	 * @return
	 */
	public static String encodePasswordForAZT(String rawPass, String salt) {
		String saltedPass = mergePasswordAndSaltForAZT(DigestUtils.md5Hex(rawPass), salt);
		return DigestUtils.md5Hex(saltedPass);
	}
	
	
	
	/**
	 * 访老系统加密方式 
	 * @author  张栋
	 */
	public static String frontEncodePassword(String pass,String salt){
		return DigestUtils.md5Hex(DigestUtils.md5Hex(pass)+salt);
	}
	public static void main(String[] args) {	
//		String randomSalt = getRandomSalt(6);
//		String password ="123qwe";
//		String encodePassword = encodePasswordForAZT(password,"LMJoZH");
//		//System.out.println(encodePassword);
//		System.out.println(checkPassword("123qwe", "LMJoZH", "fa41f7f8f0dde8852e74ea7cbeac9bc3"));
		
		
		System.out.println(SimpleLock(SimpleLock("123qwe")));
	}
	
	
	/**
	 * @Field @TOKEN_KEY : 生成toke异或的key
	 */
	public static String TOKEN_KEY = "AZT";
	
	
	/**
	 * @Description 用异或进行简单的加密(执行一次是加密，再执行一次是解密)
	 * @param token
	 * @return
	 */
	public static String SimpleLock(String token){
		if(!StringUtils.isBlank(token)){
			//StringBuffer sb = new StringBuffer();
			char[] charArray = token.toCharArray();
			for(int i = 0 , j = 0 ; i  < token.length() ; i++ , j++){
				if(j == TOKEN_KEY.length()) j = 0;
				charArray[i] = (char)(token.charAt(i)^TOKEN_KEY.charAt(j));
			}
			return new String(charArray);
		}
		return "";
	}
	
	
	
	/** 
	 * 密码与盐值 混淆规则
	 * @author  张栋
	 */
	protected  static String mergePasswordAndSalt(String password, Object salt,
			boolean strict) {
		if (password == null) {
			password = "";
		}
		if (strict && (salt != null)) {
			if ((salt.toString().lastIndexOf("{") != -1)
					|| (salt.toString().lastIndexOf("}") != -1)) {
				throw new IllegalArgumentException(
						"Cannot use { or } in salt.toString()");
			}
		}
		//salt为空不混淆
		if ((salt == null) || "".equals(salt)) {
			return password;
		} else {
			return password + "{" + salt.toString() + "}";
		}
	}
	
	protected  static String mergePasswordAndSaltForAZT(String password, Object salt) {
		if (password == null) {
			password = "";
		}
		//salt为空不混淆
		if ((salt == null) || "".equals(salt)) {
			return password;
		} else {
			return password + salt.toString() ;
		}
	}
	
	
	public static String MD5_16(String content){
		String md5Hex = DigestUtils.md5Hex(content);
		return md5Hex.substring(8, 24);
	}
	
}